/**
 * 手机号格式化工具
 * 显示前3位和后4位，中间用*号代替
 * @param {string} phone - 手机号
 * @returns {string} - 格式化后的手机号，如：138****4567
 */
export const formatPhone = (phone) => {
  // 如果手机号为空，返回空字符串
  if (!phone) return ''
  
  // 去除所有空格
  phone = phone.replace(/\s/g, '')
  
  // 如果不是有效的11位手机号，返回原值
  if (!/^\d{11}$/.test(phone)) return phone
  
  // 返回格式化后的手机号
  return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
}

/**
 * 验证身份证号码
 * @param {string} idCard - 身份证号码
 * @returns {boolean} - 是否是有效的身份证号码
 */
export const validateIdCard = (idCard) => {
  // 如果身份证号为空，返回false
  if (!idCard) return false
  
  // 去除所有空格
  idCard = idCard.replace(/\s/g, '')
  
  // 15位和18位身份证号码的正则表达式
  const regIdCard = /(^\d{15}$)|(^\d{17}(\d|X|x)$)/
  
  // 如果格式不对，返回false
  if (!regIdCard.test(idCard)) return false
  
  // 如果是15位身份证号码，直接返回true
  if (idCard.length === 15) return true
  
  // 18位身份证号码校验码计算
  if (idCard.length === 18) {
    // 加权因子
    const factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    // 校验码对应值
    const parity = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    // 身份证号前17位
    const idCardArray = idCard.substr(0, 17).split('')
    // 计算校验和
    const sum = idCardArray.reduce((acc, curr, index) => {
      return acc + parseInt(curr) * factor[index]
    }, 0)
    // 计算校验码
    const check = parity[sum % 11]
    // 校验最后一位
    return check === idCard.substr(17, 1).toUpperCase()
  }
  
  return false
}

/**
 * 格式化身份证号码，显示前4位和后4位，中间用*号代替
 * @param {string} idCard - 身份证号码
 * @returns {string} - 格式化后的身份证号码，如：1101****1234
 */
export const formatIdCard = (idCard) => {
  // 如果身份证号为空，返回空字符串
  if (!idCard) return ''
  
  // 去除所有空格
  idCard = idCard.replace(/\s/g, '')
  
  // 如果不是有效的身份证号码，返回原值
  if (!validateIdCard(idCard)) return idCard
  
  // 返回格式化后的身份证号码
  return idCard.replace(/(\d{4})\d*(\d{4})/, '$1****$2')
}

// 使用示例：
// formatPhone('13812345678') => '138****5678'
// validateIdCard('110101199001011234') => true/false
// formatIdCard('110101199001011234') => '1101****1234' 